import gui.Gui;

import java.util.ArrayList;
import java.util.List;

import simulador.Simulador;
import util.Entrada;
import util.Persistencia;
import util.Resultado;


public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		if(args.length < 1){
			return;
		}

		if(args[0].toLowerCase().equals("--batch")){
			if(args.length >= 2 && args[1].toLowerCase().equals("--start")){
				rodeModoBatch(true);				
			}else{
				rodeModoBatch(false);
			}
		}else{
			rodeModoGui();
		}
	}

	private static void rodeModoBatch(boolean comeco) {
		Persistencia p = new Persistencia(comeco);
		Entrada entrada = p.carregarEntrada();

		System.out.println("########## Dados para entrada " + p.getNumeroDaEntrada() + " ##########");

		System.out.println();
		double taxaDeChegadaEmHora = entrada.getTaxaDeChegadaEmHora();
		System.out.println("taxaDeChegadaEmHora " + taxaDeChegadaEmHora);
		double tempoDeAluguelEmDias = entrada.getTempoDeAluguelEmDias() * 24;
		System.out.println("tempoDeAluguelEmDias " + tempoDeAluguelEmDias );
		int numeroDeCarros = entrada.getNumeroDeCarros();
		System.out.println("numeroDeCarros " + numeroDeCarros);
		double tempoDeAtendimentoEmHora = entrada.getTempoDeAtendimentoEmHora();
		System.out.println("tempoDeAtendimentoEmHora " + tempoDeAtendimentoEmHora);
		int valorDoCarro = entrada.getValorDoCarro();
		System.out.println("valorDoCarro " + valorDoCarro);
		int gastoDiarioComCarro = entrada.getGastoDiarioComCarro();
		System.out.println("gastoDiarioComCarro " + gastoDiarioComCarro);
		int anosComUmCarro = entrada.getAnosComUmCarro();
		System.out.println("anosComUmCarro " + anosComUmCarro);
		int valorDaDiariaDoAluguel = entrada.getValorDaDiariaDoAluguel();
		System.out.println("valorDaDiariaDoAluguel " + valorDaDiariaDoAluguel);
		double confidenceLavel = new Double(entrada.getConfidenceLavel()) / 100;
		int gastoDiarioComLocadora = entrada.getDespesaDiariaComLocadora();
		System.out.println("gastoDiarioComLocadora " + gastoDiarioComLocadora);		
		System.out.println("confidenceLavel " + confidenceLavel);
		System.out.println();

		Simulador simulador = new Simulador(taxaDeChegadaEmHora, tempoDeAluguelEmDias, numeroDeCarros,
				tempoDeAtendimentoEmHora, confidenceLavel, 0.08); 

		simulador.rodarSimulador();

		System.out.println();
		System.out.println("ClientesAtendidos " + simulador.getClientesAtendidos());
		System.out.println("AlugueisDeCarro " + simulador.getAlugueisDeCarro());
		System.out.println("SaidasSemCarro " + simulador.getSaidasSemCarro());
		System.out.println("DiasDeSimulacao " + simulador.getDiasDeSimulacao());
		System.out.println();
		System.out.println();

		double lucro = 0;

		int comprasDeFrota = (int)Math.round((simulador.getDiasDeSimulacao() / 365) / anosComUmCarro) + 1; 
		double aquisicaoDeCarros = (numeroDeCarros * valorDoCarro) * comprasDeFrota;
		lucro -= aquisicaoDeCarros;

		double despesasComCarros = numeroDeCarros * simulador.getDiasDeSimulacao() * gastoDiarioComCarro;
		lucro -= despesasComCarros;
		
		double despesasComLocadora = simulador.getDiasDeSimulacao() * gastoDiarioComLocadora;
		lucro -= despesasComLocadora;


		List<Integer> numeroDeClientesPorCarro = simulador.getNumeroDeClientesPorCarro();
		List<Double> tempoMedioDeAluguelPorCarro = simulador.getTempoMedioDeAluguelPorCarro();
		double receitaComAlugueis = 0;
		for (int carro = 0; carro < numeroDeClientesPorCarro.size(); carro++) {
			receitaComAlugueis += numeroDeClientesPorCarro.get(carro) * tempoMedioDeAluguelPorCarro.get(carro) * valorDaDiariaDoAluguel;
		}

		lucro += receitaComAlugueis;

		Resultado resultado = new Resultado();
		double diasDeSimulacao = simulador.getDiasDeSimulacao();
		resultado.setDiasDeSimulacao(diasDeSimulacao);
		resultado.setAquisicaoDeCarros(aquisicaoDeCarros);
		resultado.setDespesasComCarros(despesasComCarros);
		resultado.setDespesasComLocadora(despesasComLocadora);
		resultado.setReceitaComAlugueis(receitaComAlugueis);
		resultado.setLucroBruto(lucro);
		resultado.setLucroBrutoMensal(lucro / (diasDeSimulacao / 30));
		double clienteAtendidos = simulador.getClientesAtendidos();
		resultado.setClientesAtendidos(clienteAtendidos);
		resultado.setTaxaDeClientesComCarro(simulador.getAlugueisDeCarro() / clienteAtendidos);
		resultado.setTaxaDeClientesSemCarro(simulador.getSaidasSemCarro() / clienteAtendidos);


		p.salvarResultado(resultado);
	}

	private static void rodeModoGui() {
		Gui gui = new Gui();

		double taxaDeChegadaEmHora = gui.getTaxaDeChegadaEmHora();
		System.out.println("taxaDeChegadaEmHora " + taxaDeChegadaEmHora);
		double tempoDeAluguelEmDias = gui.getTempoDeAluguelEmDias() * 24;
		System.out.println("tempoDeAluguelEmDias " + tempoDeAluguelEmDias );
		int numeroDeCarros = gui.getNumeroDeCarros();
		System.out.println("numeroDeCarros " + numeroDeCarros);
		double tempoDeAtendimentoEmHora = gui.getTempoDeAtendimentoEmHora();
		System.out.println("tempoDeAtendimentoEmHora " + tempoDeAtendimentoEmHora);
		double confidenceLavel = new Double(gui.getConfidenceLevel()) / 100;
		System.out.println("confidenceLavel " + confidenceLavel);

		Simulador simulador = new Simulador(taxaDeChegadaEmHora, tempoDeAluguelEmDias, numeroDeCarros,
				tempoDeAtendimentoEmHora, confidenceLavel, 0.08); 

		simulador.rodarSimulador();

		//Mostra graficos
	    String[] args = new String[1];
	    args[0] = "sim_graphs.sjg";
	    SJGV.main(args);    	
	}

}
